package com.eadaula05.oficina;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Scanner;

public class CadastroAlunoTexto {

	private Scanner entrada;
	private final String enderecoArquivo = "alunos.cdt";
	private File arquivo;
	private BufferedReader leitor;
	private BufferedWriter gravador;
	private HashMap<String, Aluno> alunos;

	public static void main(String[] args) {
		CadastroAlunoTexto cat = new CadastroAlunoTexto();
		cat.iniciar();
	}

	public CadastroAlunoTexto() {
		arquivo = new File(enderecoArquivo);
		alunos = new HashMap<String, Aluno>();
		entrada = new Scanner(System.in);

		iniciar();
	}

	private void iniciar() {
		int opcao = -1;
		try {

			lerArquivo();

			do {
				exibeMenu();
				opcao = opcaoUsuario();
				switch (opcao) {
				case 1: {
					exibirAlunos();
					break;
				}
				case 2: {
					novoAluno();
					break;
				}
				case 3: {
					removerAluno();
					break;
				}
				case 4: { // Sair
					break;
				}
				default: {
					System.out.println("OpÁ„o inexistente.");
					opcao = -1;
				}
				}

			} while (opcao != 4);

			finalizar();

		} catch (IOException ioe) {
			System.out.println("Falha durante a manipulaÁ„o do arquivo.");
		}

		System.out.println("Encerrando..");
		System.exit(0);

	}

	private void finalizar() throws IOException {
		System.out.println("Salvando dados no arquivo..");
		gravarArquivo();
	}

	private void exibeMenu() {
		System.out.println(":: Menu ::\n");
		System.out.println(" 1. Ver Alunos\n 2. "
				+ "Adicionar Aluno\n 3. Remover Aluno\n 4. Sair");
		System.out.print(">> ");
	}

	private int opcaoUsuario() throws IOException {
		return entrada.nextInt();
	}

	private void exibirAlunos() {
		System.out.println("# Lista de Alunos");
		for (Aluno a : alunos.values()) {
			System.out.println("MatrÌcula: " + a.getMatricula());
			System.out.println("Nome: " + a.getNome());
			if (a.getEndereco() != null && !a.getEndereco().isEmpty()) {
				System.out.println("EndereÁo: " + a.getNome());
			}
			if (a.getTelefone() != null && !a.getTelefone().isEmpty()) {
				System.out.println("Telefone: " + a.getNome());
			}
			System.out.println();
		}
		System.out.println("-----------------------");
	}

	private void novoAluno() {
		System.out
				.println("Informe matricula, nome, endereco e " +
						"telefone do aluno, separados por vÌrgula.");
		System.out.print("* Apenas matrÌcula e nome s„o " +
				"obrigatÛrios. \n>>");
		entrada.nextLine();

		String dados = entrada.nextLine();
		String[] dadosAluno = dados.split(",");

		Aluno a = new Aluno(dadosAluno[0], dadosAluno[1]);
		if (dadosAluno.length >= 3) {
			a.setEndereco(dadosAluno[2]);
		}
		if (dadosAluno.length >= 4) {
			a.setTelefone(dadosAluno[3]);
		}

		alunos.put(a.getMatricula(), a);
	}

	private void removerAluno() {
		System.out.print("Informe matricula do aluno que deseja " +
				"remover.\n>>");
		entrada.nextLine();

		String matricula = entrada.nextLine();

		if (alunos.containsKey(matricula)) {
			Aluno a = alunos.remove(matricula);
			System.out.println("Aluno " + a.getNome() + " removido..");
		} else {
			System.out.println("Matricula n„o encontrada..");
		}

	}

	private void lerArquivo() throws IOException {

		System.out.println("Carregando dados do arquivo..");
		leitor = new BufferedReader(new FileReader(arquivo));
		String dados = "";

		while ((dados = leitor.readLine()) != null) {
			String[] dadosAluno = dados.split(",");

			Aluno aluno = new Aluno(dadosAluno[0], dadosAluno[1]);
			if (dadosAluno.length >= 3) {
				aluno.setEndereco(dadosAluno[2]);
			}
			if (dadosAluno.length >= 4) {
				aluno.setTelefone(dadosAluno[3]);
			}

			alunos.put(aluno.getMatricula(), aluno);
		}

		leitor.close();
		leitor = null;

	}

	private void gravarArquivo() throws IOException {
		if (alunos != null) {
			gravador = new BufferedWriter(new FileWriter(arquivo, false));
			for (Aluno a : alunos.values()) {
				String representacaoAluno = a.getMatricula() + ","
						+ a.getNome();
				if (a.getEndereco() != null && !a.getEndereco().isEmpty()) {
					representacaoAluno += "," + a.getEndereco();
				}
				if (a.getTelefone() != null && !a.getTelefone().isEmpty()) {
					representacaoAluno += "," + a.getTelefone();
				}
				gravador.write(representacaoAluno
						+ System.getProperty("line.separator"));
			}
			gravador.flush();
			gravador.close();
			gravador = null;
		}
	}

} // Final da Classe
